import os
import sys
import shutil
import ffmpeg
import argparse

parser = argparse.ArgumentParser(description='''
    批量合并*.ts文件输出成.mp4文件
    -d 存放ts文件的上级目录
    -f ts文件目录下的单个视频的ts目录名
    输出[ts文件目录\\video\\*.mp4]''')


# 视频url
parser.add_argument("-d", "--dir", type=str, default=None, help=".ts file dir; 存放*.ts文件的上级目录")
# 输出文件
parser.add_argument("-f", "--file", type=str, default=None, help="ts path file; 存放ts文件夹名文件")
# 脚本参数
args = parser.parse_args()

# 读取文件
def read_file(file_path):
    with open(file_path, 'r') as f:
        return f.readlines()

# 转成mp4
def convert_to_mp4(input_file, output_file):
    ffmpeg.input(input_file).output(output_file + '.mp4', vcodec='copy', acodec='copy', loglevel='quiet').run()
    print(f'{output_file} ==> 格式转换完成!')

# 合并视频
def concat_ts_into_mp4(input_dir, output_file):
    # 获取所有 .ts 文件的路径
    input_files = sorted([os.path.join(input_dir, f) for f in os.listdir(input_dir) if f.endswith('.ts')])
    # print(f'files: {input_files}')
    print(f'\n正在合并视频: {output_file}')
    # 打开输出文件  
    with open(output_file, 'wb') as out_file:
        # 依次读取每个输入文件的内容并写入输出文件         
        for input_file in input_files:
            with open(input_file, 'rb') as in_file:
                shutil.copyfileobj(in_file, out_file)
    convert_to_mp4(output_file, output_file)


if __name__ == "__main__":
    if args.dir and args.file:
        dir_name = args.dir
        file_path = args.file
        # 视频文件夹
        video_path = os.path.join(dir_name, 'video')
        if not os.path.exists(video_path):
            os.makedirs(video_path)
            print(video_path, '=== 目录创建成功')
        else:
            print(video_path, '=== 目录存在')
        for line in read_file(file_path):
            input_dir = os.path.join(dir_name, line.strip('\n'))
            concat_ts_into_mp4(input_dir, os.path.join(video_path, line.strip('\n')))
    else:
        parser.print_help()
